                ;------------------
                ;CPC Mousepack 2.0 disassembly, 8/2010 by nocash
                ;disassembly of I/O part used by MOUSEDEM.BAS
                ;------------------
9000            pos_x   dw ....   ;x coord (0..639) (0=left, 639=top)
9002            pos_y   dw ....   ;y coord (0..399) (0=bottom, 399=top)
                ;------------------
                irq_handler:  ;called at 300Hz rate
90AE CD 1F 96    call 961F      ;-dummy (ret)
90B1 3A BF B8    ld   a,[B8BFh] ;\irq counter (1..6)
90B4 3D          dec  a         ; exit if non-vblank irq
90B5 C0          ret  nz        ;/
90B6 01 0E F4    ld   bc,F40Eh                  ;\PPI.A (PSG index)
90B9 ED 49       out  [bc],c  ;[F4XXh]=0Eh      ;/
90BB 06 F6       ld   b,F6h                     ;\
90BD ED 78       in   a,[bc]  ;[F6xxh]          ; PPI.C (PSG: write index, row0)
90BF E6 30       and  a,30h   ;cas.motor.data   ; (with old cassette bits,
90C1 4F          ld   c,a     ;typ=00h (cas=off); which are typically zero)
90C2 F6 C0       or   a,C0h   ;typ=C0h          ;
90C4 ED 79       out  [bc],a  ;[F6xxh]=typ C0h  ;/
90C6 ED 49       out  [bc],c  ;[F6xxh]=typ 00h  ;-PPI.C (PSG: inactive, row0)
90C8 04          inc  b       ;F7h              ;\
90C9 3E 92       ld   a,92h                     ; PPI.CTRL (direction=read)
90CB ED 79       out  [bc],a  ;[F7xxh]=92h      ;/
90CD C5          push bc      ;b=F7h, C=inactive
90CE 3E 49       ld   a,49h   ;bc1.bdir=1,row=9 ;\
90D0 B1          or   a,c     ;typ=49h          ; precalc ppi.c values
90D1 4F          ld   c,a     ;typ=49h          ; for row 9 and row 6
90D2 5F          ld   e,a     ;typ=49h          ; (stick1 and stick2)
90D3 D6 03       sub  a,03h   ;typ=46h   ;row6  ;
90D5 57          ld   d,a     ;typ=46h          ;/
                ;---
90D6 06 F6       ld   b,F6h                     ;\PPI.C (PSG: data read, row9)
90D8 ED 49       out  [bc],c  ;[F6xxh]=typ 49h  ;/
90DA 06 0F       ld   b,0Fh      ;7             ;\delay (197 clks)
90DC 10 FE       djnz $          ;13*14+8       ;/
90DE 06 F4       ld   b,F4h                     ;\
90E0 ED 78       in   a,[bc]                    ;
90E2 87          add  a,a                       ;
90E3 87          add  a,a                       ; read pos x (msb)
90E4 87          add  a,a                       ;
90E5 87          add  a,a                       ;
90E6 67          ld   h,a                       ;/
90E7 06 0F       ld   b,0Fh                     ;\delay (197 clks)
90E9 10 FE       djnz $                         ;/
90EB 06 F4       ld   b,F4h                     ;\
90ED ED 78       in   a,[bc]                    ;
90EF E6 0F       and  a,0Fh                     ; read pos x (lsb)
90F1 B4          or   a,h  ;merge ;positive=lt  ;
90F2 ED 44       neg       ;neg   ;positive=rt  ;
90F4 67          ld   h,a                       ;/
90F5 06 F6       ld   b,F6h                     ;\PPI.C (PSG: data read, row6)
90F7 ED 51       out  [bc],d  ;[F6xxh]=typ 46h  ;/
                ;---
90F9 ED 59       out  [bc],e  ;[F6xxh]=typ 49h  ;-PPI.C (PSG: data read, row9)
90FB 06 05       ld   b,05h      ;7             ;\short delay (67 clks)
90FD 10 FE       djnz $          ;13*4+8        ;/
90FF 06 F4       ld   b,F4h                     ;\
9101 ED 78       in   a,[bc]                    ;
9103 87          add  a,a                       ;
9104 87          add  a,a                       ; read pos y (msb)
9105 87          add  a,a                       ;
9106 87          add  a,a                       ;
9107 6F          ld   l,a                       ;/
9108 06 14       ld   b,14h      ;7             ;\delay (262 clks)
910A 10 FE       djnz $          ;13*19+8       ;/
910C 06 F4       ld   b,F4h                     ;\
910E ED 78       in   a,[bc]                    ;
9110 E6 0F       and  a,0Fh                     ; read pos y (lsb)
9112 B5          or   a,l  ;merge  ;positive=up ;
9113 6F          ld   l,a                       ;/
9114 06 F6       ld   b,F6h                     ;\PPI.C (PSG: data read, row6)
9116 ED 51       out  [bc],d  ;[F6xxh]=typ 46h  ;/
                ;---
9118 C1          pop  bc      ;b=F7h, C=inactive
9119 3E 82       ld   a,82h                     ;\PPI.CTRL (direction=write)
911B ED 79       out  [bc],a  ;[F7xxh]=82h      ;/
911D 05          dec  b       ;F6h              ;\PPI.C (PSG: inactive, row0)
911E ED 49       out  [bc],c  ;[F6xxh]=typ 00h  ;/
9120 E5          push hl
9121 7C          ld   a,h                       ;\
9122 2A 00 90    ld   hl,[pos_x]                ; raise pos x (crappy: 
9125 CD 45 95    call add_hl_a                  ; without doublespeed threshold)
9128 22 00 90    ld   [pos_x],hl                ;/
912B E1          pop  hl
912C 7D          ld   a,l                       ;\
912D 2A 02 90    ld   hl,[pos_y]                ; raise pos y (crappy: 
9130 CD 45 95    call add_hl_a                  ; without doublespeed threshold)
9133 22 02 90    ld   [pos_y],hl                ;/
9136 11 90 01    ld   de,0190h  ;=400 decimal   ;\
9139 7C          ld   a,h                       ;
913A B7          or   a,a                       ;
913B ED 52       sbc  hl,de                     ;
913D DA 50 91    jp   c,@@this_pos_y            ; clip pos y to 0..399
9140 1B          dec  de ;018Fh  ;=399 decimal  ;
9141 ED 53 02 90 ld   [pos_y],de                ;
9145 FE 80       cmp  a,80                      ;
9147 DA 50 91    jp   c,@@this_pos_y            ;
914A 21 00 00    ld   hl,0000h                  ;
914D 22 02 90    ld   [pos_y],hl                ;
                @@this_pos_y:                   ;/
9150 11 80 02    ld   de,0280h  ;=640 decimal   ;\
9153 2A 00 90    ld   hl,[pos_x]                ;
9156 7C          ld   a,h                       ;
9157 B7          or   a,a                       ;
9158 ED 52       sbc  hl,de                     ; clip pos x to 0..639
915A D8          ret  c  ;=this_pos_x           ;
915B 1B          dec  de ;027Fh  ;=639 decimal  ;
915C ED 53 00 90 ld   [pos_x],de                ;
9160 FE 80       cmp  a,80                      ;
9162 D8          ret  c  ;=this_pos_x           ;
9163 21 00 00    ld   hl,0000h                  ;
9166 22 00 90    ld   [pos_x],hl                ;/
9169 C9          ret
                ;------------------
                add_hl_a:  ;HL=HL+A  ;(A = sign-expanded)
9545 CB 7F       bit  7,a
9547 28 01       jr   z,@@positive
9549 25          dec  h
                @@positive:
954A 85          add  a,l
954B 6F          ld   l,a
954C D0          ret  nc
954D 24          inc  h
954E C9          ret
                ;------------------
